import functools


def log(fun):
    @functools.wraps(fun)  # 将原始函数的__name__等属性进行复制
    def wrapper(*args, **kw):
        print('call %s' % fun.__name__)
        return fun(*args, **kw)

    return wrapper


@log
def stat():
    print(' i  o  u')


stat()


def log1(fun):
    def decorator(fun):  # decorator本身需要传入参数，那就需要编写一个返回decorator的高阶函数
        @functools.wraps(fun)  # 将原始函数的__name__等属性进行复制
        def wrapper(*args, **kw):
            print('call %s' % fun.__name__)
            return fun(*args, **kw)

        return wrapper

    return decorator


@log1
def stat1():
    print(' i  o  u')



